﻿#include <fstream>
#include <filesystem>
#include "runtime.h"
#include <define.h>
#include <interface.h>
#include "inipp.h"

// runtime 构造函数，初始化 _market 和 _trader 指针为 nullptr
runtime::runtime() noexcept : _market(nullptr), _trader(nullptr)
{
}

// runtime 析构函数，销毁 _market 和 _trader 对象
runtime::~runtime() noexcept
{
    // 如果 _market 不为空，调用销毁函数释放资源
	if (_market)
	{
		destory_actual_market(_market);
	}
    
    // 如果 _trader 不为空，调用销毁函数释放资源
	if (_trader)
	{
		destory_actual_trader(_trader);
	}
}

// 从配置文件初始化 runtime 对象
bool runtime::init_from_file(const std::string& config_path) noexcept
{
    // 检查配置文件是否存在
	if (!std::filesystem::exists(config_path.c_str()))
	{
		LOG_ERROR("runtime_engine init_from_file config_path not exit : %s", config_path.c_str());
		return false;
	}

    // 使用 inipp 库解析 INI 格式的配置文件
	inipp::Ini<char> ini;
	std::ifstream is(config_path.c_str());
	ini.parse(is);

    // 查找配置文件中名为 "include" 的段
	auto it = ini.sections.find("include");
	if (it == ini.sections.end())
	{
		LOG_ERROR("runtime_engine init_from_file cant find [include]", config_path.c_str());
		return false;
	}
    
    // 解析 "include" 段的参数
	params include_patams(it->second);

    // 查找配置文件中名为 "actual_market" 的段
	it = ini.sections.find("actual_market");
	if (it == ini.sections.end())
	{
		LOG_ERROR("runtime_engine init_from_file cant find [actual_market]", config_path.c_str());
		return false;
	}
    
    // 创建一个共享指针，用于保存交易市场和交易所 ID 的映射关系
	auto&& id_excg_map = std::make_shared<std::unordered_map<std::string, std::string>>();
	
    // 创建交易市场对象
    // first 是键（key），表示元素的键值。
	// second 是值（value），表示与键关联的数据。
	
	_market = create_actual_market(id_excg_map, it->second);
	if (_market == nullptr)
	{
		LOG_ERROR("runtime_engine init_from_file create_market_api ", config_path.c_str());
		return false;
	}

    // 查找配置文件中名为 "actual_trader" 的段,应该类似查找逻辑
	it = ini.sections.find("actual_trader");
	if (it == ini.sections.end())
	{
		LOG_ERROR("runtime_engine init_from_file cant find [actual_trader]", config_path.c_str());
		return false;
	}
    
    // 创建交易者对象，通过string来添加
	_trader = create_actual_trader(id_excg_map, it->second);
	if (_trader == nullptr)
	{
		LOG_ERROR("runtime_engine init_from_file create_trader_api error : %s", config_path.c_str());
		return false;
	}

    // 查找配置文件中名为 "control" 的段
	it = ini.sections.find("control");
	if (it == ini.sections.end())
	{
		LOG_ERROR("runtime_engine init_from_file cant find [control]", config_path.c_str());
		return false;
	}
    
    // 解析 "control" 段的参数，从control来，带参构造
	params control_patams(it->second);

    // 使用解析后的参数初始化 runtime 对象，增加性能调优调整参数
	this->init(control_patams, include_patams);
	return true;
}

// 登录交易账户
bool runtime::login_account() noexcept
{
    // 如果 _trader 对象存在且成功登录
	if (_trader && _trader->login())
	{
        // 如果 _market 对象存在且成功登录
		if (_market && _market->login())
		{
			return true;
		}
	}
	return false;
}

// 登出交易账户
void runtime::logout_account() noexcept
{
    // 如果 _trader 对象存在，调用登出函数
	if (_trader)
	{
		_trader->logout();
	}

    // 如果 _market 对象存在，调用登出函数
	if (_market)
	{
		_market->logout();
	}
}

// 获取交易者 API 的引用
trader_api& runtime::get_trader() noexcept
{
	return *_trader;
}

// 获取市场 API 的引用
market_api& runtime::get_market() noexcept
{
	return *_market;	
}

// 更新操作，可以用于周期性任务或状态更新
void runtime::on_update() noexcept
{
	// 目前没有实现内容，可以根据需要添加更新逻辑
}

// 检查交易者是否已经处于空闲状态（交易终止）
bool runtime::is_terminaled() noexcept
{
    // 如果 _trader 对象存在，返回其是否空闲的状态
	if (_trader)
	{
		return _trader->is_idle();
	}
	return false;
}
